/**
 * 主要思想： 在子类型中调用超类型的构造函数
 * 优点：
 *      1. 可以向超类型传递参数
 *      2. 解决了原型中包含引用类型值被所有实例共享的问题
 * 缺陷：
 *      1. 方法都在构造函数中定义，函数无法复用
 *      2. 超类型原型中定义的方法对于子类型来说是不可见的
 */
function SuperType (name) {
  this.name = name,
  this.colors = ['green', 'blue']
}

SuperType.prototype.sayColors = function () {
  console.log(this.colors)
}

function Subtype (name) {
  SuperType.call(this, name)
}

Subtype.prototype.sayName = function () {
  console.log(this.name)
}

const instance1 = new Subtype('Yeoman')
instance1.colors.push('yellow')
console.log(instance1.colors)
instance1.sayName()

const instance2 = new Subtype('LYM')
console.log(instance2.colors)
instance2.sayName()
instance2.sayColors() //  报错！
